Appearance
1、基础知识
参考: https://javaguide.cn/java/io/io-basis.html
IO 指的是输入和输出(主体是计算机内存)
- 输入: 数据输入到计算机内存
- 输出:从计算机内存输出到外部设备
了解 Java IO 流,需要知道四个基本的抽象类基类:
InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
常用方法建议直接看一下 API 方法
IO
- 字节流
- InputStream 字节输入流
- OutputStream 字节输出流
- 字符流
- Reader
- Writer
- 字节缓冲流
- BufferedInputStream(字节缓冲输入流)
- BufferedOutputStream(字节缓冲输出流)
- 字符缓冲流
- 打印流
- 随机访问流
一般来说,我们是建议如果读取文字的时候使用字符流,字符流默认采用的是 Unicode 编码,因此不会出现很明显的输入和输出编码不一致的情况;
对于音频、图片等建议使用字节流。
记录一个面试题
常用字符编码所占字节数?>
utf8 :英文占 1 字节,中文占 3 字节,unicode:任何字符都占 2 个字节,gbk:英文占 1 字节,中文占 2 字节
2、缓冲流
BufferedInputStream(字节缓冲输入流)
BufferedInputStream 从源头(通常是文件)读取数据(字节信息)到内存的过程中不会一个字节一个字节的读取,而是会先将读取到的字节存放在缓存区,并从内部缓冲区中单独读取字节。这样大幅减少了 IO 次数,提高了读取效率。
BufferedInputStream 内部维护了一个缓冲区,这个缓冲区实际就是一个字节数组,通过阅读 BufferedInputStream 源码即可得到这个结论。
public
class BufferedInputStream extends FilterInputStream {
// 内部缓冲区数组
protected volatile byte buf[];
// 缓冲区的默认大小
private static int DEFAULT_BUFFER_SIZE = 8192;
// 使用默认的缓冲区大小
public BufferedInputStream(InputStream in) {
this(in, DEFAULT_BUFFER_SIZE);
}
// 自定义缓冲区大小
public BufferedInputStream(InputStream in, int size) {
super(in);
if (size <= 0) {
throw new IllegalArgumentException("Buffer size <= 0");
}
buf = new byte[size];
}
}缓冲区的大小默认为 8192 字节,当然,你也可以通过 BufferedInputStream(InputStream in, int size) 这个构造方法来指定缓冲区的大小。
3、IO 设计模式
to be contined...
4、NIO
IO 模型
UNIX 系统下, IO 模型一共有 5 种:同步阻塞 I/O、同步非阻塞 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O
Java 中 3 种常见 IO 模型
- NIO
- BIO
- AIO
NIO详解
to be contined...